          GET(ARG.,1) PASSER ELSE PASSER = ''
** Version# 147.0003[76] - 05/09/2010 - 03:38pm - SMITJR - eclipse
*** V147.0003 Change - Custom Coding . - 05/09/2010 - SMITJR - eclipse
*** Subroutine - PRD.LOCATION.MAINT.GETARG
*-------------------------------------------------------------------------*
*** This routine allows users to maintain onhands, locations, lots and
*** everything else associated with a loc/onhand in the whse for products
*** in the branch they input. It is usually called from PRD.LOCATION.MAINT
*** and is done so to keep COMMON from being in conflict (through EXECUTE)
*** The user must have the auth key "PRD.LOCATION.MAINT" to get into this
*** routine, LEVEL < 2 is view only, LEVEL = 2 allows them to move qtys
*** around but not change the overall onhand and LEVEL > 2 allows full
*** edit.
*-------------------------------------------------------------------------*
*** PASSER    - "~" Delimitted string that turns into AM delim     (IN)
***           - by a CONVERT statement.
*** PASSER<1> - Default product to display (only edit this one)
*** PASSER<2> - Branch to show for the above product
*** PASSER<3> - View only override (1=view only)
***
*** None of the PASSER values must be filled in - they're all "overrides"
*** so that the normal prompting/checking will not happen.
*-------------------------------------------------------------------------*
*** COMMON VARIABLES :
*** PRD, PRDD, LED, OLED, PRDD.BR, LD, OLD.LD, CUS, CUSS, PRDP, PLNB
*** Arrays are all used in this routine (or the routines it calls).
*** However, if called correctly (through PRD.LOCATION.MAINT) and an
*** EXECUTE all should be protected as they're in unnamed COMMON.
*** AUTH.KEYS must be setup for CHECK.KEY
*** USER.ID must be setup for logging changes in change logs
*** OID.DATA$<5> - store PN used in PASS ID of user defined screens
*-------------------------------------------------------------------------*

          CONVERT '~' TO AM IN PASSER

          CHECK.KEY 'PRD.LOCATION.MAINT',ENTRY.OK,LEVEL
          IF NOT(ENTRY.OK) THEN RETURN
          CHECK.KEY 'PRD.TAG.LOC.MOVE',TAG.MOVE.OK
          READV PLQM FROM CTRLFILE,'PRD.LOC.QTY.MOVE',1 ELSE PLQM = NO

          VALID.LTYPS = 'D:,S - Stock,F - DeFective,O - Over Shipment,R - Review,L - DispLay,T - Tagged,C - Customer Consignment'
          VALID.STATS = 'D:,P - Primary,S - Secondary,F - Floating,R - Remnant'
          VALID.CTRL = 'D:,None,Lot,Detail Lot'

          * See if they are storing serial numbers by location.
          READV SLC.FLAG FROM CTRLFILE,'RF.LOC.BY.SERS',1 ELSE SLC.FLAG=''
          READV SCONV FROM CTRLFILE,'SERIAL.CONV.NEEDED',1 ELSE SCONV = ''

          * If a conversion still needs to run then serials are
          * being stored the opposite of what is in RF.LOC.BY.SERS
          IF SCONV THEN SLC.FLAG = NOT(SLC.FLAG)

          READV VIEW.OPTS FROM CTRLFILE,'PRD.LOCATION.VIEWS',1 ELSE
             VIEW.OPTS      = 'Last Count / Location Pick Status'
             VIEW.OPTS<1,2> = 'Replenish Min / Max Qtys'
             VIEW.OPTS<1,3> = 'Home Location'
             VIEW.OPTS<1,4> = 'Pre-Package Qtys'
             VIEW.OPTS<1,5> = 'Tote / Picker'
             VIEW.OPTS<1,6> = 'Last Count / Exp Date'
             VIEW.OPTS<1,7> = 'Last Count / Recv Date'
             VIEW.OPTS<1,8> = 'RF Put Away Date / Time'
             VIEW.OPTS<1,9> = 'Last Count / Review Type / Original Type'
          END
          SCREEN.NAME = 'PRD.LOCATION.MAINT.GETARG'
          GET.SCREEN.INFO SCREEN.NAME,'LAST.VIEW',DFLT.VIEW
          IF NOT(DFLT.VIEW) THEN
             READ DFLT.VIEW FROM CTRLFILE,'DFLT.LOC.MAINT.VIEW' ELSE
                DFLT.VIEW = VIEW.OPTS<1,1>
             END
          END
          LOCATE DFLT.VIEW IN VIEW.OPTS<1> SETTING VIEW ELSE
             VIEW = 1
          END

          REQ.WARN    = 0
          NEW.LN      = 0
          COLS        = 8
          BR          = ''
          CHNG        = NO
          BREAK.TAG   = NO

          SCREEN
START:    CLEAR.SCREEN
          MERGED  = NO
          VSCROLL.DEFINE 1,1,6,78,10,'PRD.LOCATION.MAINT'
          VSCROLL.SET 1

          DSP.LINES   = 0
          LINE        = 0
          PN          = ''
          VIEW.ONLY   = NO
          NEW.PRDD    = NO
          SER.BAL     = 0
          DIFF.QTY    = 0
          FROM.DEL    = NO
          FROM.MOVE   = NO
          BR.AUTH     = YES

          IF PASSER#'' THEN
             BR.NAME   = ''
             PN        = PASSER<1>
             BR        = PASSER<2>
             VIEW.ONLY = PASSER<3>
             IF BR THEN
                LOCATE BR IN SECURITY<9> SETTING POS ELSE BR.AUTH = NO
                IF PN THEN GOTO GET.PN
             END
          END
*-------------------------------------------------------------------------*
          IF BR#'' THEN
             PRINT @(12,1):BR "L#10"
          END ELSE
IN.BR:       INP.BR 12,1,10,BR,BR.NAME
             IF QUIT THEN GOTO FINISH
          END
*-------------------------------------------------------------------------*
          IF PN#'' THEN GOTO GET.PN
IN.PN:    INP PN,12,2,35,'TPRODUCT;X;1;1',V_'S:VERF.PRD.ID'
          IF QUIT THEN GOTO FINISH
          ON MOVE+1 GOTO IN.PN, IN.PN, IN.BR, IN.PN, IN.PN
*-------------------------------------------------------------------------*
GET.PN:   LOC.DB.BR.ENABLED BR,LOC.DB.ENABLED
          READV RF.LOC.BY.UOM FROM CTRBFILE,"RF.LOC.BY.UOM~":BR,1 ELSE
             RF.LOC.BY.UOM = NO
          END
          GOSUB LOAD.VIEW
          MATREAD PRD  FROM PRDFILE,PN ELSE PRINT BELL:; GOTO IN.PN
          MATREAD PLNE FROM PLNEFILE,PRD(9) ELSE MAT PLNE = ''

          READV NOTHING FROM PRDDFILE,PN,0 ELSE NEW.PRDD = YES

          PRDD.BR.GET BR,PN
          PRDC.BR.GET BR,PN
          PRD.BR.GET  BR,PN

          * If there is no previous prod dynam record, we need to default
          * the control type to what is set up at price line level per
          * branch.  We will set this branch now so the display will
          * reflect price line setup and then set up all branches in
          * UPD.DATA
          IF PRD.BR(11) = '' THEN
             PLNE.BR.GET.VAL BR,PRD(9),6,PLNE.CTYPE
             PRD.BR(11) = PLNE.CTYPE
          END

          IF PRD(15) # '' THEN UM.TBL = PRD(15) ELSE UM.TBL = PLNE(3)
          VALID.UOMS = 'D:':UM.TBL
          LOWEST.UOM = UM.TBL<1,1>

          DFLT.PER.GET 'I',PER,PER.UM

          OID.DATA$<5> = PN

          IF LEVEL < 2 THEN VIEW.ONLY = YES
          IF VIEW.ONLY THEN
             PRINT @(2,0):BLINK$:'View Only':NORM$
          END ELSE
             PRINT @(2,0):''
          END

          GOSUB LOAD.DATA
          OH.CHANGED = NO
          GOSUB CALC.ONHAND
          OLD.ONHAND = CURR.ONHAND
          KITEM = (PRD(53)#"")
          IF PRD(106) THEN KITEM = NO

          GOSUB DISPLAY
          GOSUB SET.MENUS

          * Check for invalid location type.
          * If it's an invalid type then make sure the user is forced to
          * change it to a valid type.  Since the new valid type gets
          * saved right after entering through UPD.DATA, we need to do this
          * before they enter any other information so that only the new
          * type gets saved.
          GOSUB CHECK.VALID.TYPE
          GOSUB CHECK.VALID.STAT

          GOTO EDIT
*-------------------------------------------------------------------------*
INCTYP:   INP CTYP,65,1,14,V_VALID.CTRL
          IF QUIT THEN GOTO FILEIT
          IF CHANGED THEN GOSUB SET.MENUS
          ON MOVE+1 GOTO INCTYP,INCTYP,INCTYP,INCTYP
*-------------------------------------------------------------------------*
EDIT:     LASTKEY = 0; MOVE = 0; LINE = 1; COL = 1
          DNOK = YES; NEWOK = YES; QUIT = NO
          CURR.LINE = 0
          IF INVALID.TYPE THEN
             MESS    = BELL:'Invalid location type.'
             ERR.MESS 3,3,MESS
             * Start user at invalid location type.
             LINE = INVALID.LINE
             INVALID.TYPE = NO
          END ELSE
          LOC=FIELD(LOCAS<1,LINE>,'~',2)
          IF INVALID.STAT AND LOC#'' THEN
             MESS    = BELL:'Status must have a value! - 1'
             ERR.MESS 3,3,MESS
             GOTO IN.STAT
END
END
*-------------------------------------------------------------------------*
MOVENEXT: IF QUIT THEN GOTO FILEIT
          LTYPE = FIELD(LOCAS<1,LINE>,'~',1)
          NEWOK = (LTYPE#'')
          PARSEMOVE COL,LINE,COLS,LN.CT,10,DNOK,NEWOK,BORDERMOVE

IN.TABLE: *** redisplay the vscroll table
          IF COL > COLS THEN COL = COLS
          IF LINE # CURR.LINE THEN
             GOSUB GET.LINE
          END

          LTYPE = FIELD(LOCAS<1,LINE>,'~',1)
          BEGIN CASE
          CASE VIEW.ONLY
IN$$1:       INPV A,1,LINE,0
             GOTO MOVENEXT
          CASE BORDERMOVE = 2
             GOTO INCTYP
          CASE FIELD(LOCAS<1,LINE>,'~',4)
             MESS 10,3,'Inprocess Qty - No Editing Allowed'
IN$$2:       INPV X,1,LINE,0
             GOTO MOVENEXT
          CASE LTYPE = ''
             * This works only because IN.TYP is the next line after
             * this case statement.
             COL = 1
          CASE OTHERWISE
             IF COL < 5 OR (COL = 5 AND RF.LOC.BY.UOM) THEN
                ON COL GOTO IN.TYP,IN.LOCA,IN.LOT.CK,IN.QTY,IN.UM
             END

             * If we are not doing UM by location, then the user can't
             * enter the UM column.
             IF RF.LOC.BY.UOM THEN
                TMP.COL = COL - 5
             END ELSE
                TMP.COL = COL - 4
             END

             BEGIN CASE
             CASE VIEW = 1
                ON TMP.COL GOTO IN.STAT,IN.CNT,IN.PKS
             CASE VIEW = 2
                ON TMP.COL GOTO IN.STAT,IN.MIN,IN.MAX
             CASE VIEW = 3
                ON TMP.COL GOTO IN.STAT
             CASE VIEW = 4
                ON TMP.COL GOTO IN.STAT,IN.PPQ
             CASE VIEW = 5
                ON TMP.COL GOTO IN.STAT
             CASE VIEW = 6
                ON TMP.COL GOTO IN.STAT,IN.CNT,IN.EXPDT
             CASE VIEW = 7
                ON TMP.COL GOTO IN.STAT,IN.CNT,IN.RCVDT
             CASE VIEW = 8
                ON TMP.COL GOTO IN.STAT,IN.RFPDT,IN.RFPTM
             CASE VIEW = 9
                ON TMP.COL GOTO IN.STAT,IN.CNT
             END CASE
          END CASE
*-------------------------------------------------------------------------*
IN.TYP:   INPV TYP,0,LINE,1,'MCU',V_VALID.LTYPS
          IF TYP = LTYPE[1,1] THEN CHANGED = NO
          TEMP.TYPE = LTYPE[1,1]

          IF CHANGED AND NOT(F12) THEN
             IF LTYPE # 'T' AND TYP='T' THEN
                MESS 5,3,BELL:'Tags can only be created thru Procurement'
                VPRINT 0,LINE,LTYPE  "L#1"
                GOTO IN.TYP
             END
             IF TYP = 'C' THEN
                MESS 5,3,BELL:'Consignment can only be created thru Consignment Orders.'
                VPRINT 0,LINE,LTYPE  "L#1"
                GOTO IN.TYP
             END
             IF LEN(LTYPE)>1 AND INDEX('CS',LTYPE[1,1],1) THEN
                MESS 3,3,BELL:'Cannot change type on consignment location. Change thru an order or po.'
                VPRINT 0,LINE,LTYPE  "L#1"
                GOTO IN.TYP
             END


             LTYPE = TYP
             GOSUB UPD.LINE
             IF UPD.ERR THEN PRINT BELL:; GOTO IN.TYP

             * Check to see if old type was 'Z' invalid location.  If
             * so, update the record so appropriate areas get logged.
             IF TEMP.TYPE = 'Z' THEN
                GOSUB UPD.DATA
                OLD.LOCAS = LOCAS
             END
          END
          IF TYP = ''  THEN
             IF (MOVE>2 OR MOVE<0) OR QTYS<1,LINE>#'' THEN
               MESS 5,3,BELL:'Type must have a value!'
               GOTO IN.TYP
             END
          END
          GOTO MOVENEXT
*-------------------------------------------------------------------------*
IN.LOCA:  INPV LOC,2,LINE,12
          NEED.UPD = NO
          IF CHANGED AND NOT(F12) THEN
             * Certain characters are not allowed in product locations.
             CHECK.FOR.INVAL.CHARS LOC,"@#^&*~|",60,MSG.LIST
             IF (MSG.LIST # "") THEN
                MSG.LIST = RAISE(MSG.LIST)
                ERR.MSG  = "The following characters are not allowed "
                ERR.MSG := "in product locations: ":AM:MSG.LIST:AM
                ERR.MSG := "Please select different characters."
                ERR.MESS ,,ERR.MSG,YES
                VPRINT 2,LINE," "                   "L#12"
                GOTO IN.LOCA
             END
             CONVERT '.' TO '-' IN LOC
             IF LPKLC # '' THEN
                LPLCS<1,LINE> = LOC
                LPKLC         = LOC
             END ELSE
                TMP.QTY = QTYS<1,LINE>
                GOSUB GET.DIFF.QTY
                PRD.LOCATION.DB.CHECK LOC,BR,PN,QTY.DIFF,NO,OK,ERR.MSG
                IF NOT(OK) THEN
                   PRINT BELL:
                   VPRINT 2,LINE,LOC.ID     "L#12"
                   GOTO IN.LOCA
                END
                NEED.UPD = YES
             END
          END
          IF NEED.UPD = YES THEN
             LOC.ID = LOC
             GOSUB UPD.LINE
             IF UPD.ERR THEN PRINT BELL:; GOTO IN.TYP
          END
          GOTO MOVENEXT
*-------------------------------------------------------------------------*
IN.LOT.CK:IF CTYP[1,1]='N' AND LOT.ID='' THEN
             IF MOVE = 2 OR MOVE = 4 THEN MOVE = 1
             GOTO MOVENEXT
          END
IN.LOT:   IF CTYP[1,1]='D' THEN
             VERF = 'S:VERF.DET.LOT.ID,':PN:'~New'
          END ELSE VERF = ''
          LOT = LOT.ID
INP.LOT:  INPV LOT,15,LINE,15,V_VERF
          IF CHANGED AND NOT(F12) THEN
             IF LOT = '' THEN
                LOT = LOT.ID
                VPRINT 15,LINE,LOT "L#15"
                GOTO INP.LOT
             END
             IF CTYP[1,1]='D' AND OCONV(LOT,'MCU')='NEW' THEN
                LOT = 'NEW'
                GOSUB CALL.LOT
                VPRINT 15,LINE,LOT "L#15"
             END

             LOT.ID = LOT
             GOSUB UPD.LINE
             IF UPD.ERR THEN PRINT BELL:; GOTO IN.LOT
          END
          GOTO MOVENEXT
*-------------------------------------------------------------------------*
IN.QTY:   INPV NEW.QTY,44,LINE,9
          IF F12 THEN GOTO FILEIT

          IF HELP AND NOT(CHANGED) THEN
             IN.QTY = QTYS<1,LINE>
             DISP.UM.HELP ,,IN.QTY,VIEW.ONLY

             IF IN.QTY # QTYS<1,LINE> THEN
                NEW.QTY = IN.QTY:LOWEST.UOM
                CHANGED = YES
                HELP    = NO
             END
          END

          * Check for +/- input options
          BEGIN CASE
          CASE NEW.QTY[1,1] = '+'
             NEW.QTY = TRIM(NEW.QTY[2,999])
             IF NUM(NEW.QTY) AND NEW.QTY # '' THEN
                NEW.QTY = TRIM(DISP.QTY) + NEW.QTY
             END
          CASE NEW.QTY[1,1] = '-'
             NEW.QTY = TRIM(NEW.QTY[2,999])
             IF NUM(NEW.QTY) AND NEW.QTY # '' THEN
                NEW.QTY = TRIM(DISP.QTY) - NEW.QTY
             END
          END CASE

          IF NOT(NUM(NEW.QTY)) OR NEW.QTY = '' THEN
             VPRINT 44,LINE,DISP.QTY "R#9"
             NEW.QTY = ''
             GOTO IN.QTY
          END

          IF TRIM(NEW.QTY) = TRIM(DISP.QTY) THEN
             IF CHANGED THEN
                * If user enters same number, still update last count
                * date then move to next field specified.
                LCNTS<1,LINE> = DATE()
             END
             GOSUB DISP.LN
             GOTO MOVENEXT
          END

          LINE.UM = LUOMS<1,LINE>
          PRD.PARSE.QTY NEW.QTY,LINE.UM,QTY,1,,PARSE.ERR
          IF PARSE.ERR THEN
             VPRINT 44,LINE,BELL:DISP.QTY "R#9"
             NEW.QTY = ''
             GOTO IN.QTY
          END
          IF HELP THEN
             DISP.UM.HELP ,,QTY,VIEW.ONLY
          END
          IF QTY = QTYS<1,LINE> THEN
             GOSUB DISP.LN
             GOTO MOVENEXT
          END

          GOSUB UPD.QTY
          IF UPD.OK AND CHANGED THEN
             LCNTS<1,LINE> = DATE()
          END
          GOSUB DISP.LN

          * Allow level two to move qtys if Control set to YES or
          * allow movement of vendor consignment material
          IF UPD.OK AND CHANGED AND DIFF.QTY AND ((PLQM AND LEVEL=2) OR VEN.CONS.MV) THEN
             SV.LINE = LINE
             GOSUB GET.ADJ.LN
             LINE    = SV.LINE
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
IN.UM:    INPV UM,54,LINE,2,V_VALID.UOMS

          IF UM # LUOMS<1,LINE> THEN
             LUOMS<1,LINE> = UM
             GOSUB DISP.LN
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
IN.STAT:  INPV STAT,58,LINE,1,V_VALID.STATS
          LSTATS<1,LINE> = STAT
          LOC=FIELD(LOCAS<1,LINE>,'~',2)
          IF STAT = '' AND LOC#'' THEN
          IF (MOVE>2 OR MOVE<0) THEN
          MESS 3,3,BELL:'Status must have a value! - 2'
          GOTO IN.STAT
          END
          END
          STAT = LSTATS<1,LINE>
          GOSUB UPD.LINE
          IF UPD.ERR THEN PRINT BELL:; GOTO IN.STAT
          GOTO MOVENEXT
*-------------------------------------------------------------------------*
*** Check Location Status
STAT.CHK:  LSTATS<1,LINE> = STAT
           LOC=FIELD(LOCAS<1,LINE>,'~',2)
           IF STAT= '' AND LOC#'' THEN
           UPD.ERR = YES
           MESS 3,3,BELL:'Status must have a value! - 4'
           GOTO IN.STAT
           END
           RETURN
*-------------------------------------------------------------------------*
IN.CNT:   INPV LCNT,61,LINE,8,'D2/'
          LCNTS<1,LINE> = LCNT
          GOTO MOVENEXT
*-------------------------------------------------------------------------*
IN.PKS:   INPV LPST,70,LINE,8,V_'C:VALID.LOCN.PICK.STATUSES'
          LPSTS<1,LINE> = LPST
          GOTO MOVENEXT
*-------------------------------------------------------------------------*
*** This allows the user to enter the replenish minimum
IN.MIN:   INPV MIN,61,LINE,8
          IF CHANGED OR HELP THEN
             IF MIN # '' THEN
                IF LMAXS<1,LINE> # '' AND MIN > LMAXS<1,LINE> THEN
                   MESS = BELL:'Min can not be greater than the max.'
                   ERR.MESS 3,3,MESS
                   GOTO IN.MIN
                END
                LINE.UM = LUOMS<1,LINE>
                PRD.PARSE.QTY MIN,LINE.UM,MIN,1,,PARSE.ERR
                IF PARSE.ERR THEN
                   PRINT BELL:;
                   GOTO IN.MIN
                END
             END

             IF HELP THEN
                DISP.UM.HELP ,,MIN,VIEW.ONLY
             END

             LMINS<1,LINE> = MIN
             GOSUB DISP.LN
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
*** This allows the user to enter the replenish maximum.
IN.MAX:   INPV MAX,70,LINE,8
          IF CHANGED OR HELP THEN
             IF MAX # '' THEN
                IF LMINS<1,LINE> # '' AND MAX < LMINS<1,LINE> THEN
                   MESS = BELL:'Max can not be less than the min.'
                   ERR.MESS 3,3,MESS
                   GOTO IN.MAX
                END

                LINE.UM = LUOMS<1,LINE>
                PRD.PARSE.QTY MAX,LINE.UM,MAX,1,,PARSE.ERR
                IF PARSE.ERR THEN
                   PRINT BELL:;
                   GOTO IN.MAX
                END
             END

             IF HELP THEN
                DISP.UM.HELP ,,MAX,VIEW.ONLY
             END

             LMAXS<1,LINE> = MAX
             GOSUB DISP.LN
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
IN.PPQ:   INPV PPQ,61,LINE,12,'R'
          PPQTYS<1,LINE> = PPQ

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
IN.EXPDT: INPV EXPDT,70,LINE,8,'D2/'
          LEXPDTS<1,LINE> = EXPDT

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
IN.RCVDT: IF ENTRY.OK AND LEVEL >= 3 THEN
IN$$15:      INPV RCVDT,70,LINE,8,'D2/'
             IF CHANGED THEN
                IF RCVDT > DATE() THEN
                   MESS 5,10,BELL:'Received Date cannot be later than today.'
                   GOTO IN.RCVDT
                END
                LRCVDTS<1,LINE> = RCVDT
             END ELSE
                GOSUB DISP.LN
             END
          END ELSE
             * User does not have access to this field. Since the move to
             * the right is still active, subtract 2 from column so that
             * the user will be returned the the previous column
             PRINT BELL:
             COL -= 2
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
*** Enter RF Put Away Date
IN.RFPDT: IF ENTRY.OK AND LEVEL >= 2 THEN
IN.PUTDT:    INPV PUTDT,61,LINE,8,'D2/'
             IF CHANGED THEN
                IF PUTDT > DATE() THEN
                   MSG = 'RF Put Away Date cannot be later than today.'
                   MESS 5,10,BELL:MSG
                   GOTO IN.PUTDT
                END
                LPUTDTS<1,LINE,1> = PUTDT
                IF NOT(LPUTDTS<1,LINE,2>) THEN
                   LPUTDTS<1,LINE,2> = 1
                   VPRINT 71,LINE,OCONV(LPUTDTS<1,LINE,2>,'MTH')
                END
             END ELSE
                GOSUB DISP.LN
             END
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
*** Enter RF Put Away Time
IN.RFPTM: IF ENTRY.OK AND LEVEL >= 2 THEN
IN.PUTTM:    INPV PUTTM,71,LINE,7,'MTH'
             IF CHANGED THEN
                LPUTDTS<1,LINE,2> = PUTTM
             END ELSE
                GOSUB DISP.LN
             END
          END

          GOTO MOVENEXT
*-------------------------------------------------------------------------*
UPD.QTY:  *** update qty, this routine updates:
          *** QTY         - The new quantity                       [IN]
          *** UPD.OK      - Whether or not the update worked       (OUT)
          *** VEN.CONS.MV - Whether this is a vendor consignment   (OUT)
          ***             - location that needs to be moved.

          UPD.OK      = YES
          VEN.CONS.MV = NO

          IF QTY = QTYS<1,LINE> THEN
             CHANGED = NO
          END

          IF NOT(CHANGED) THEN RETURN

          * Check to make sure the user is auth'd to edit a tagged loc
          * and that they aren't trying to INCREASE a tag qty
          REDUCE.QTY = (QTY < QTYS<1,LINE>)
          BEGIN CASE
          CASE LTYPE = 'T' AND (NOT(TAG.MOVE.OK) OR LEVEL = 2)
             MSG = 'You are not authorized to move a tagged quantity, <Return> '
             ANS = ''
IN.QTY1:     INP.PROMPT ANS,MSG

             UPD.OK = NO
             RETURN
          CASE LTYPE = 'T' AND NOT(REDUCE.QTY)
             MSG = 'Cannot increase a tagged quantity, reference F9 for more information. <Return>'
             ANS = ''
IN.QTY3:     INP.PROMPT ANS,MSG

             UPD.OK = NO
             RETURN
          CASE LTYPE = 'T' AND REDUCE.QTY AND TAG.MOVE.OK
             MSG = 'WARNING! This is a tagged quantity.  This will'
             MSG<-1> = 'break the tag.  Continue (Y/N): '
             ANS = 'N'
IN.QTY2:     INP.PROMPT ANS,MSG,'YN',1
             CHANGED = YES
             IF NOT(ANS) THEN
                UPD.OK = NO
                RETURN
             END
             BREAK.TAG = YES
          END CASE

          * Only allow changes to vendor consignment - not customer
          * consignment.  If change to vendor consignment qty, ask user
          * where they would like to add the difference.  Users cannot
          * change total qty but can move vendor consignment from line
          * to line
          IF LEN(LTYPE)>1 AND INDEX('CS',LTYPE[1,1],1) THEN
             IF LTYPE[1,1] = 'C' THEN
                ERR.MESS 3,3,BELL:'Cannot change qty on consignment location. Change thru an order or po.'
                UPD.OK = NO
                RETURN
             END ELSE
                * Don't allow locations to become negative
                IF QTY < 0 THEN
                   ERR.MESS 3,3,BELL:'Cannot have a negative quantity on a consignment location.'
                   UPD.OK = NO
                   RETURN
                END ELSE
                   VEN.CONS.MV = YES
                END
             END
          END

          * Make sure new quantity will fit in the desired location
          TMP.QTY = QTY
          GOSUB GET.DIFF.QTY
          PRD.LOCATION.DB.CHECK LOC,BR,PN,QTY.DIFF,NO,LOC.OK,ERR.MSG
          IF NOT(LOC.OK) THEN
             ERR.MESS 3,3,BELL:ERR.MSG
             UPD.OK = NO
             RETURN
          END

          * If the locations qty was zero and now has a positive qty
          * then update the locations receive date.
          IF QTYS<1,LINE>+0 = 0 AND QTY > 0 THEN
             LRCVDTS<1,LINE> = DATE()
           END

          DIFF.LTYPE   = LTYPE
          DIFF.QTY     = QTY - QTYS<1,LINE>
          QTYS<1,LINE> = QTY

          GOSUB DISP.TOT.ONHAND

          RETURN
*-------------------------------------------------------------------------*
GET.ADJ.LN: *** Adjust the change of qty to a new line
          *** If user has proper auth then allow them to place vendor
          *** consignment material on a new line

          OTYPE = LTYPE
          LN.CT = DCOUNT(LOCAS<1>,VM)
          IF DCOUNT(QTYS<1>,VM) > LN.CT THEN LN.CT = DCOUNT(QTYS<1>,VM)
          IF LN.CT < 1 THEN LN.CT = 1

          IF VEN.CONS.MV AND LEVEL > 2 THEN
             LASTLINE = LN.CT + 1
          END ELSE
             LASTLINE = LN.CT
          END

          IF DIFF.QTY>0 THEN COMM = 'reduce' ELSE COMM = 'increase'

          IF PER # 1 THEN
             D.DIFF.QTY = DIFF.QTY/PER
          END ELSE
             D.DIFF.QTY = DIFF.QTY
          END

LOOP.DIFF: *** determine where to make up the qty diff
          DIFF.MSG     = 'Position cursor on quantity to ':COMM:' by '
          DIFF.MSG    := ABS(D.DIFF.QTY):' and press <Enter>'
          VNCN.MSG     = 'Consignment inventory can only be moved between '
          VNCN.MSG<-1> = 'same vendor consignment locations.'
          TO.VEN.CONS  = NO

          LOOP
             GOSUB GET.LINE
             IF LEN(LTYPE) > 1 AND LTYPE[1,1] # 'C' THEN
                TO.VEN.CONS = YES
             END ELSE
                TO.VEN.CONS = NO
             END

             DIFF.OK = NO
             BEGIN CASE
             CASE FIELD(LOCAS<1,LINE>,'~',4)
                MESS 10,3,'Inprocess Qty - No Editing Allowed'
IN$$13:         INPVNO ,1,LINE,0
             CASE LTYPE[1,1] = 'C'
                MSG  = 'Cannot change qty on consignment location. '
                MSG := 'Change thru an order or po.'
                MESS 3,3,MSG
IN$$16:         INPVNO ,1,LINE,0
             CASE VEN.CONS.MV AND LTYPE AND LTYPE # DIFF.LTYPE
                MESS 3,3,VNCN.MSG
IN$$17:         INPVNO ,1,LINE,0
             CASE TO.VEN.CONS AND NOT(VEN.CONS.MV)
                MESS 3,3,VNCN.MSG
IN$$18:         INPVNO ,1,LINE,0
             CASE OTHERWISE
                MESS 5,2,DIFF.MSG
IN.DIFF1:       INPVNO ,44,LINE,0
                DIFF.OK = YES
             END CASE

             BEGIN CASE
             CASE QUIT
                * IF the user hits escape or F12, then the quantities
                * should be put back to how they were before this whole
                * thing started.
                LINE = SV.LINE
                IF FROM.DEL THEN
                   LOCAS   = INSERT(LOCAS,1,LINE;SV.LOCA)
                   QTYS    = INSERT(QTYS,1,LINE;'')
                   LSTATS  = INSERT(LSTATS,1,LINE;SV.LSTAT)
                   LMINS   = INSERT(LMINS,1,LINE;SV.LMIN)
                   LMAXS   = INSERT(LMAXS,1,LINE;SV.LMAX)
                   LUOMS   = INSERT(LUOMS,1,LINE;SV.LUOM)
                   LCNTS   = INSERT(LCNTS,1,LINE;SV.LCNT)
                   LSBYS   = INSERT(LSBYS,1,LINE;SV.LSBY)
                   SNUMS   = INSERT(SNUMS,1,LINE;SV.SNUM)
                   SQTYS   = INSERT(SQTYS,1,LINE;SV.SQTY)
                   LPSTS   = INSERT(LPSTS,1,LINE;SV.LPST)
                   LPLCS   = INSERT(LPLCS,1,LINE;SV.LPLC)
                   PPQTYS  = INSERT(PPQTYS,1,LINE;SV.PPQTY)
                   LEXPDTS = INSERT(LEXPDTS,1,LINE;SV.LEXPDT)
                   LRCVDTS = INSERT(LRCVDTS,1,LINE;SV.LRCVDT)
                   LPUTDTS = INSERT(LPUTDTS,1,LINE;SV.LPUTDT)
                   LREV.TYPS = INSERT(LREV.TYPS,1,LINE;SV.LREV.TYP)
                   VINS LINE
                   LN.CT += 1
                   DSP.LINES = LN.CT
                END
                GOSUB GET.LINE
                EXIT
             CASE MOVE=2 AND LINE>1;          LINE -= 1
             CASE MOVE=4 AND LINE<LASTLINE;   LINE += 1
             CASE LASTKEY = 13 AND DIFF.OK;   * Enter Key
                EXIT
             CASE OTHERWISE;                  PRINT BELL:
             END CASE
          REPEAT

          * Only allow vendor consignment inventory to be moved within
          * consignment locations for the same vendor
          IF (VEN.CONS.MV OR TO.VEN.CONS) AND LTYPE AND LTYPE # DIFF.LTYPE THEN
             ERR.MESS 3,2,BELL:VNCN.MSG
IN.DIFF3:    INPNO ,3,2,0
             GOTO LOOP.DIFF
          END

          * Set variable if user moved consignment material to a non-
          * consigned location or to a consigned location that is not
          * for the original vendor OR moved non-consigned material
          * to a consigned location.
          CONS.FROM = (VEN.CONS.MV AND OTYPE # LTYPE)
          CONS.MOVE = (LEN(OTYPE) = 1 AND LEN(LTYPE) > 1)

          * Set up new location
          IF LOCAS<1,LINE> THEN
             NEW.LOC = OTYPE:'~':FIELD(LOCAS<1,LINE>,'~',2)
          END ELSE
             NEW.LOC = OTYPE
          END

          * If new location already exists in locations table then
          * just increase the qty on that line else create a new
          * entry
          NEG.QTY = NO
          LOCATE NEW.LOC IN LOCAS<1> SETTING POS.LINE THEN
             LINE = POS.LINE
          END ELSE
             BEGIN CASE
             CASE LOCAS<1,LINE> = ''
                NEW.LOC = OTYPE
                GOSUB FILL.LINE
                LN.CT  += 1
             CASE CONS.FROM OR CONS.MOVE
                LINE += 1
                GOSUB INS.LINE
                GOSUB FILL.LINE
                LINE -= 1
             END CASE
          END

          QTY     = QTYS<1,LINE> - DIFF.QTY
          CHANGED = YES
          SV.VEN.CONS.MV = VEN.CONS.MV
          GOSUB UPD.QTY
          GOSUB DISP.LN

          IF NOT(UPD.OK) THEN
IN.DIFF2:    INPNO ,3,3,0
             VEN.CONS.MV = SV.VEN.CONS.MV
             GOTO LOOP.DIFF
          END

          VEN.CONS.MV  = NO

          CURR.LINE = -1  ;* Make sure that the line info is gathered
          F12       = NO
          QUIT      = NO
          MOVE      = NO
          LASTKEY   = NO

          RETURN
*-------------------------------------------------------------------------*
GET.LINE: *** load up the current line data

          LTYPE  = FIELD(LOCAS<1,LINE>,'~',1)
          LOC.ID = FIELD(FIELD(LOCAS<1,LINE>,'~',2),'|',1)
          LOT.ID = FIELD(FIELD(LOCAS<1,LINE>,'~',2),'|',2)
          TAG.ID = FIELD(FIELD(LOCAS<1,LINE>,'~',3),'^',1)
          IF FIELD(LOCAS<1,LINE>,'~',4)='' THEN
             IF LTYPE='T' THEN
                TAG.ID = FIELD(FIELD(LOCAS<1,LINE>,'~',3),'^',2)
             END
          END ELSE
             WK.OID = FIELD(TAG.ID,'.',1)
             WK.GID = FIELD(TAG.ID,'.',2)
             WK.REST= FIELD(TAG.ID,'.',3,99)
             READ LREC FROM LEDFILE,WK.OID THEN
                LOCATE WK.GID IN LREC<12> SETTING WK.GEN THEN
                   TAG.ID = WK.OID:'.':LREC<8,WK.GEN>:'.':WK.REST
                END
             END
          END
          LPKLC = ''
          IF LPSTS<1,LINE>#'' AND LPLCS<1,LINE>#'' THEN LPKLC = LPLCS<1,LINE>
          CURR.LINE = LINE

          IF FIELD(LOCAS<1,LINE>,'~',4) THEN
             * If it is inprocess, then we can get a tote.
             READV TOTE.ID FROM WHQFILE,LOCAS<1,LINE>,7 ELSE TOTE.ID = ''
             READV PICK.ID FROM WHQFILE,LOCAS<1,LINE>,6 ELSE PICK.ID = ''
             IF PICK.ID # '' THEN TOTE.ID = TOTE.ID:'/':PICK.ID
          END ELSE TOTE.ID = ''

          GOSUB GET.LINE.PER
          OUT.QTY = QTYS<1,LINE> / LINE.PER
          GOSUB GET.DISP.QTY

          RETURN
*-------------------------------------------------------------------------*
GET.LINE.PER: *** This returns LINE.PER, the per qty for the current line.

          IF RF.LOC.BY.UOM THEN
             UOM.PER.GET LUOMS<1,LINE>,LINE.PER
          END ELSE
             LINE.PER = PER
          END

          RETURN
*-------------------------------------------------------------------------*
GET.DIFF.QTY: *** Finds the quantity difference between what is on the
          *** screen for a given location - regardless of location
          *** type and what is in the db.  This value will be sent
          *** to Prd.location.db.check to validate the changed quantity

          TMP.SCRN.QTY   = 0
          TMP.DB.QTY     = 0
          SV.DIFF.LINE   = LINE

          * Get the info on the screen for the given location
          DIFF.CT = DCOUNT(LOCAS<1>,VM)
          FOR LINE = 1 TO DIFF.CT
             GOSUB GET.LINE
             IF LINE = SV.DIFF.LINE THEN
                TMP.SCRN.QTY += TMP.QTY
             END ELSE
                IF LOC = LOC.ID THEN TMP.SCRN.QTY += QTYS<1,LINE>
             END
          NEXT LINE

          * Get the info in the db for the given location
          LOC.DB.GET.QTY ERR.MSG,LOC,BR,PN,TMP.DB.QTY

          * Compare the two and return the difference.
          QTY.DIFF = TMP.SCRN.QTY - TMP.DB.QTY

          LINE = SV.DIFF.LINE
          GOSUB GET.LINE

          RETURN
*-------------------------------------------------------------------------*
GET.DISP.QTY: *** This converts OUT.QTY to DISP.QTY.

          NUMBER.WIDTH.FMT DISP.QTY,OUT.QTY,9

          RETURN
*-------------------------------------------------------------------------*
UPD.LINE: *** update line data

          UPD.ERR = NO

          IF FIELD(LOCAS<1,LINE>,'~',1) = 'T' AND LTYPE # 'T' THEN
             OID   = FIELD(TAG.ID,'.',1)
             PRMPT = 'Change a tagged qty'
             OE.GET.AUTH OID,PRMPT,'OE.TAGGED.QTY.EDIT',ACTION.OK
             IF NOT(ACTION.OK) THEN
                UPD.ERR = YES
                GOSUB DISP.LN
                RETURN
             END ELSE
                BREAK.TAG = YES
             END
          END

          NEW.LOC = LTYPE:'~':LOC.ID
          IF LOT.ID     # '' THEN NEW.LOC := '|':LOT.ID

          * Stock and vendor consignment locations do not need to be
          * tagged to an order
          IF LTYPE[1,1] # 'S' THEN
             NEW.LOC := '~':FIELD(LOCAS<1,LINE>,'~',3)
          END

          OCCR = 1

CK.DUP.LP: *** check for duplicate locations
          LOCATE NEW.LOC IN LOCAS<1>,OCCR SETTING DUP.LOC THEN
             IF DUP.LOC#LINE AND FIELD(LOCAS<1,DUP.LOC>,'~',4)#'I' THEN
IN$$3:          INP.PROMPT '','Already on line # ':DUP.LOC
                GOSUB DISP.LN
                UPD.ERR = YES
                RETURN
             END
             OCCR += 1
             GOTO CK.DUP.LP
          END
          LOCAS<1,LINE> = NEW.LOC
         *** Check Location Type
         LOC=FIELD(LOCAS<1,LINE>,'~',2)
         IF STAT= '' AND LOC#'' THEN
         UPD.ERR = YES
         MESS 3,3,BELL:'Status must have a value! - 3'
         GOTO IN.STAT

         END
          RETURN
*-------------------------------------------------------------------------*
FILL.LINE: *** Insert current values into arrays with new line position

          LOCAS<1,LINE>     =  NEW.LOC
          LSTATS<1,LINE>    = LSTATS<1,SV.LINE>
          LMINS<1,LINE>     = LMINS<1, SV.LINE>
          LMAXS<1,LINE>     = LMAXS<1, SV.LINE>
          LUOMS<1,LINE>     = LUOMS<1, SV.LINE>
          LCNTS<1,LINE>     = LCNTS<1, SV.LINE>
          LSBYS<1,LINE>     = LSBYS<1, SV.LINE>
          LPSTS<1,LINE>     = LPSTS<1, SV.LINE>
          LPLCS<1,LINE>     = LPLCS<1, SV.LINE>
          LEXPDTS<1,LINE>   = LEXPDTS<1,SV.LINE>
          LRCVDTS<1,LINE>   = LRCVDTS<1,SV.LINE>
          LPUTDTS<1,LINE>   = LPUTDTS<1,SV.LINE>

          RETURN
*-------------------------------------------------------------------------*
DISPLAY:  *** display screen info

          PRINT @(12,1):BR          "L#5"
          PRINT @(20,1):BR.NAME     "L#15"
          PRINT @(37,1):PN
          PRINT @(12,2):PRD(1)<1,1> "L#35"
          PRINT @(12,3):PRD(1)<1,2> "L#35"
          PRINT @(12,4):PRD(1)<1,3> "L#35"

          GOSUB DISP.TOT.ONHAND

          CTYP = PRD.BR(11)
          BEGIN CASE
          CASE CTYP = 'S'; CTYP = 'Serialized'
          CASE CTYP = 'L'; CTYP = 'Lot'
          CASE CTYP = 'D'; CTYP = 'Detail Lot'
          CASE OTHERWISE;  CTYP = 'None'
          END CASE
          PRINT @(65,1):CTYP                  "L#14"

          GOSUB DISP.LINES

          RETURN
*-------------------------------------------------------------------------*
DISP.TOT.ONHAND: *** Display the total onhand and serial count.

          * These need to be setup so that the remove statement in the
          * call to GET.ONHAND will not attempt the remove on the local
          * arrays.
          ONHANDS = QTYS
          OH.LOCS = LOCAS
          GET.ONHAND ONHANDS,OH.LOCS,ONHAND
          IF PER # 1 THEN
             OH.FMT = "R2#8"
             QFMT   = 'N2'
             PERLGT = LEN(PER)
             IF PERLGT > 5 THEN PERLGT = 5
             PER.LGTH = "R#":PERLGT
             PRINT @(49,4):BLINK$:PER.UM"L#2":" - ":PER PER.LGTH:NORM$
          END ELSE
             OH.FMT = "R#8"
             QFMT   = 'N'
          END

          ONHAND    = ONHAND/PER
          TMP.SQTYS = PRDD.BR(21)
          IF SLC.FLAG THEN CONVERT SVM TO VM IN TMP.SQTYS
          SER.BAL = SUMMATION(TMP.SQTYS)/PER

          PRINT @(65,2):ONHAND      OH.FMT:PER.UM "L#2"
          IF PRD.BR(25)='I' OR PRD.BR(25)='A' OR PRD.BR(25)='D' THEN
             PRINT @(49,3):'Ser# Balance  : ':SER.BAL OH.FMT:PER.UM "L#2"
          END

          RETURN
*-------------------------------------------------------------------------*
DISP.LINES: *** display screen line info

          SV = LINE
          FOR LINE = 1 TO LN.CT
             GOSUB DISP.LN
          NEXT LINE
          LINE = SV
          IF LINE > LN.CT THEN LINE = LN.CT

          RETURN
*-------------------------------------------------------------------------*
DISP.LN:  *** This gets and displays a single line/location.

          GOSUB GET.LINE

          IF LPKLC = '' THEN LOC.DISP = LOC.ID ELSE LOC.DISP = LPKLC

          IF LEN(LTYPE)>1 THEN
             WK.ID = LTYPE[2,999]
             READV TAG.DISP FROM CUSFILE,WK.ID,9 ELSE TAG.DISP='.':WK.ID
          END ELSE
             TAG.DISP = TAG.ID
          END

          IF FIELD(LOCAS<1,LINE>,'~',4) THEN
             STAT.DISP = '*I*'
          END ELSE
             STAT.DISP = ' ':LSTATS<1,LINE>
          END

          IF RF.LOC.BY.UOM THEN
             UM = LUOMS<1,LINE>
             IF UM = '' THEN
                IF PRD(15)<1,1> # '' THEN
                   UM = PRD(15)<1,1>
                END ELSE
                   UM = PLNE(3)<1,1>
                END
             END
          END ELSE
             UM = PER.UM
          END

          VPRINT  0,LINE,LTYPE       "L#1"    ;* Type Column
          VPRINT  2,LINE,LOC.DISP    "L#12"   ;* Location Column
          VPRINT 15,LINE,LOT.ID      "L#15"   ;* Lot/Serial # Column
          VPRINT 31,LINE,TAG.DISP    "L#12"   ;* Tag ID Column
          VPRINT 44,LINE,DISP.QTY    "R#9"    ;* On-Hand Column
          VPRINT 54,LINE,UM          "L#2"    ;* UM Column
          VPRINT 57,LINE,STAT.DISP   "L#3"    ;* Status Column

          GOSUB DISP.VIEW

          RETURN
*-------------------------------------------------------------------------*
DISP.VIEW: *** display screen line info according to the current user view

          BEGIN CASE
          CASE VIEW = 1
             VPRINT 61,LINE,OCONV(LCNTS<1,LINE>,'D2/')      "L#8":''
             VPRINT 70,LINE,LPSTS<1,LINE>                   "L#8"
          CASE VIEW = 2
             LINE.MIN = LMINS<1,LINE>
             IF LINE.MIN # '' THEN
                NUMBER.WIDTH.FMT LINE.MIN,LINE.MIN/LINE.PER,8
             END
             LINE.MAX =LMAXS<1,LINE>
             IF LINE.MAX # '' THEN
                NUMBER.WIDTH.FMT LINE.MAX,LINE.MAX/LINE.PER,8
             END

             VPRINT 61,LINE,LINE.MIN                        "R#8":''
             VPRINT 70,LINE,LINE.MAX                        "R#8"
          CASE VIEW = 3
             IF LPKLC # '' THEN WRK = LOC.ID ELSE WRK = ''
             VPRINT 61,LINE,WRK                             "L#12":'    '
          CASE VIEW = 4
             IF PPQTYS<1,LINE> # '' THEN
                VPRINT 61,LINE,PPQTYS<1,LINE>               "R#12":'    '
             END ELSE
                VPRINT 61,LINE,''                           "L#12":'    '
             END
          CASE VIEW = 5
             VPRINT 61,LINE,TOTE.ID                         "L#15":'  '
          CASE VIEW = 6
             VPRINT 61,LINE,OCONV(LCNTS<1,LINE>,'D2/')      "L#8":''
             VPRINT 70,LINE,OCONV(LEXPDTS<1,LINE>,'D2/')    "L#8"
          CASE VIEW = 7
             VPRINT 61,LINE,OCONV(LCNTS<1,LINE>,'D2/')      "L#8":''
             VPRINT 70,LINE,OCONV(LRCVDTS<1,LINE>,'D2/')    "L#8"
          CASE VIEW = 8
             VPRINT 61,LINE,OCONV(LPUTDTS<1,LINE,1>,'D2/')  "L#8"
             VPRINT 71,LINE,OCONV(LPUTDTS<1,LINE,2>,'MTH')
          CASE VIEW = 9
             LREV.TYP1 = LREV.TYPS<1,LINE,1>
             IF LREV.TYP1 = 'C' THEN LREV.TYP1 = 'Cycl'
             VPRINT 61,LINE,OCONV(LCNTS<1,LINE>,'D2/')      "L#8":''
             VPRINT 70,LINE,LREV.TYP1                       "L#4":''
             VPRINT 76,LINE,LREV.TYPS<1,LINE,2>             "L#2"
          END CASE

          RETURN
*-------------------------------------------------------------------------*
FILEIT:   *** This routine updates the prod dynam record, lets the user
          *** abort, or returns the user to the editing record.

          * Save the last viewed view.
          SCREEN.NAME = 'PRD.LOCATION.MAINT.GETARG'
          SET.SCREEN.INFO SCREEN.NAME,'LAST.VIEW',VIEW.OPTS<1,VIEW>

          IF VIEW.ONLY THEN GOTO RESTART
          GOSUB STAT.CHK
          *** Check Location Type
         LSTATS<1,LINE> = STAT
         LOC=FIELD(LOCAS<1,LINE>,'~',2)
         IF STAT= '' AND LOC#'' THEN
         UPD.ERR = YES
         MESS 3,3,BELL:'Status must have a value! - 4'
         GOTO IN.STAT
         END



          IF F12 THEN
             IF MERGED THEN
                MSG    = 'Detail Lots Merged/Changed, cannot abort.'
                MSG<2> = 'Press Enter.' "R#33"
                PRINT BELL:;
                MESS 2,2,MSG
IN$$10:         INP ,2,2,0
                GOTO EDIT
             END

             CONFIRM.ABORT SURE
             IF NOT(SURE) THEN GOTO EDIT
             GOTO RESTART
          END

          GOSUB UPD.DATA
          BEGIN CASE
          CASE ERR.TO = 'LOT';    GOTO IN.LOT
          CASE ERR.TO = 'EDIT';   GOTO EDIT
          END CASE

RESTART:  IF PASSER = '' THEN
             PN = ''
             GOTO START
          END

          GOTO FINISH
*-------------------------------------------------------------------------*
UPD.DATA: *** update data

          ERR.TO = ''

          IF CTYP[1,1]#'N' THEN
             IF CTYP[1,1]='D' THEN
                MSG = 'SELECT PROD.LOT WITH &INDEX& ="':PN:'~]"'
                EXEC MSG CAPTURING NOTHING
                READLIST LIDS ELSE LIDS = ''
             END

             CT = DCOUNT(LOCAS<1>,VM)
             FOR LINE = 1 TO CT
                IF FIELD(LOCAS<1,LINE>,'~',4)#'I' THEN
                   TMP.LOT = FIELD(FIELD(LOCAS<1,LINE>,'~',2),'|',2)
                   TMP.LOT = FIELD(TMP.LOT,'!',1)
                   CHK.TM  = (INT(TIME()) - REQ.WARN)
                   IF TMP.LOT = '' AND QTYS<1,LINE> AND CHK.TM > 30 THEN
                      MSG  = "Warning: All Lots / Serial #'s "
                      MSG := "are not Entered."
                      MESS 10,2,BELL:MSG
                      ERR.TO   = 'LOT'
                      REQ.WARN = INT(TIME())
                      EXIT
                   END
                   IF CTYP[1,1]='D' AND TMP.LOT THEN
                      TMP.LOT = PN:'~':FIELD(TMP.LOT,'-',1)
                      LOCATE TMP.LOT IN LIDS SETTING NOTHING ELSE
                         MSG = FIELD(TMP.LOT,'~',2)
                         MESS 10,2,BELL:MSG:' is not a valid Detail Lot'
                         ERR.TO = 'LOT'
                         EXIT
                      END
                   END
                END
             NEXT LINE
             IF LINE<=CT THEN
                IF LINE # CURR.LINE THEN GOSUB GET.LINE
                RETURN
             END
          END

          IF SUM(QTYS)#SUM(OLD.QTYS) THEN
             IF LEVEL > 2 AND NOT(KITEM) THEN
                VAR = ''
IN$$4:          INP.PROMPT VAR,BELL:'Change On Hand by ':SUM(QTYS)-SUM(OLD.QTYS):'? (Y/N) : ','YN',1
                IF NOT(VAR) THEN
                   GOSUB RESTORE.VALS
                   LN.CT = DCOUNT(LOCAS<1>,VM)
                   IF DCOUNT(QTYS<1>,VM) > LN.CT THEN LN.CT=DCOUNT(QTYS<1>,VM)
                   GOSUB DISP.TOT.ONHAND
                   GOSUB DISP.LINES
                   ERR.TO = 'EDIT'
                   RETURN
                END
                IF SUM(QTYS) > SUM(OLD.QTYS) THEN
                   GOSUB CHK.PIL
                   IF NOT(PIL.OK) THEN
                      QTYS = OLD.QTYS
                      GOSUB DISP.LN
                      ERR.TO = 'EDIT'
                      RETURN
                   END
                END
             END ELSE
                MSG  = 'Qtys must Equal : ':SUM(OLD.QTYS)
                MSG := ' - Diff : ':SUM(OLD.QTYS)-SUM(QTYS)
                MESS 5,3,BELL:MSG
IN$$11:         INPVNO ,1,1,0
                ERR.TO = 'EDIT'
                RETURN
             END
          END

          IF BREAK.TAG THEN
             PRD.LOCATION.BRK.TAG PN,BR,LOCAS,QTYS,OLD.LOCAS,OLD.QTYS
          END

          MATBUILD NEW.PRDD.BR FROM PRDD.BR
          NEW.PRDD.BR<1>  = QTYS
          NEW.PRDD.BR<8>  = LOCAS
          NEW.PRDD.BR<9>  = LSTATS
          NEW.PRDD.BR<10> = LMINS
          NEW.PRDD.BR<11> = LMAXS
          NEW.PRDD.BR<12> = LCNTS
          NEW.PRDD.BR<13> = LSBYS
          NEW.PRDD.BR<14> = LPSTS
          NEW.PRDD.BR<15> = LPLCS
          NEW.PRDD.BR<16> = PPQTYS
          NEW.PRDD.BR<17> = LUOMS
          NEW.PRDD.BR<18> = LEXPDTS
          NEW.PRDD.BR<19> = LRCVDTS
          NEW.PRDD.BR<30> = LPUTDTS
          NEW.PRDD.BR<31> = LREV.TYPS

          MATBUILD OLD.PRDD.BR FROM PRDD.BR
          OLD.PRDD.BR<1>  = OLD.QTYS
          OLD.PRDD.BR<8>  = OLD.LOCAS
          OLD.PRDD.BR<9>  = OLD.LSTATS
          OLD.PRDD.BR<10> = OLD.LMINS
          OLD.PRDD.BR<11> = OLD.LMAXS
          OLD.PRDD.BR<12> = OLD.LCNTS
          OLD.PRDD.BR<13> = OLD.LSBYS
          OLD.PRDD.BR<14> = OLD.LPSTS
          OLD.PRDD.BR<15> = OLD.LPLCS
          OLD.PRDD.BR<16> = OLD.PPQTYS
          OLD.PRDD.BR<17> = OLD.LUOMS
          OLD.PRDD.BR<18> = OLD.LEXPDTS
          OLD.PRDD.BR<19> = OLD.LRCVDTS
          OLD.PRDD.BR<30> = OLD.LPUTDTS
          OLD.PRDD.BR<31> = OLD.LREV.TYPS

          PRD.LOCATION.UPD PN,BR,OLD.PRDD.BR,NEW.PRDD.BR,ERR.MSG,AOID

          GOSUB CALC.ONHAND
          NEW.ONHAND = CURR.ONHAND
          IF NEW.ONHAND # OLD.ONHAND THEN
             OH.CHANGED = YES
          END
          IF ERR.MSG THEN
             MESS 10,10,ERR.MSG
IN$$5:       INP A,,,0
          END ELSE IF AOID # '' THEN
             OE.LOCK.LED AOID,LOCK.MSG,YES
             IF NOT(LOCK.MSG) THEN
                UET.ENABLED = NO
                IF UET.ENABLED$ THEN
                   CTRB.ID = 'UET.ENABLED~':BR
                   READV UET.ENABLED FROM CTRBFILE,CTRB.ID,1 ELSE
                      UET.ENABLED = NO
                   END
                END
                IF UET.ENABLED AND OH.CHANGED THEN
                   UET.AOE.CHECK.ORDER AOID,1
                END
             END
             OE.UNLOCK.LED AOID
          END

          PRD.BR.WRITE.VAL   BR,PN,11,CTYP[1,1]

          * Update serial nums/qtys if locations/line items were removed
          PRDD.BR.WRITE.VAL  BR,PN,20,SNUMS
          PRDD.BR.WRITE.VAL  BR,PN,21,SQTYS

          * If this is a new record then default control type for all
          * branches to what is at the price line level
          READV BR.LIST FROM PRDBFILE,PN,40 ELSE BR.LIST = ''
          BRCT = DCOUNT(BR.LIST<1>,VM)
          FOR J = 1 TO BRCT
             IF BR.LIST<1,J> = BR THEN CONTINUE
             PRD.BR.GET.VAL BR.LIST<1,J>,PN,11,PRD.CTYPE
             IF PRD.CTYPE = '' THEN
                PLNE.BR.GET.VAL BR.LIST<1,J>,PRD(9),6,PLNE.CTYPE
                PRD.BR.WRITE.VAL BR.LIST<1,J>,PN,11,PLNE.CTYPE
             END
          NEXT J

          RETURN
*-------------------------------------------------------------------------*
CHK.PIL:  *** Check the projected inventory level of this product and make
          *** sure it's not greater than the maximum set at control file
          *** level.

          CHECK.KEY 'AOE.PIL.DAYS.OVRD',PIL.OVRD
          PIL.OK = YES

          * reading the br.spec info for buyline and prd
          BUYLINE.BR.GET.VAL BR,PRD(12),31,BLN.DAYS
          PRD.BR.GET.VAL     BR,PN,42,PRD.DAYS

          BEGIN CASE
          CASE PRD.DAYS # ''
             MDAYS = PRD.DAYS
          CASE BLN.DAYS
             MDAYS = BLN.DAYS
          CASE OTHERWISE
             READV MDAYS FROM CTRBFILE,'MAX.DAYS.SUPPLY~':BR,1 ELSE
                MDAYS = ''
             END
          END CASE

          IF MDAYS # '' THEN
             GET.PCGID PCGID,PRD(18),PRD(12)
             WHSE.FOR.ME WHSE,BR,PCGID
             WHSE.LIST WBRS,WHSE,PCGID
             WBRS = WBRS<1>
             GET.PIL PIL,WBRS,PN,''
             GET.DEMAND DEMAND,WBRS,PN
             DEMAND = OCONV(DEMAND,'MR3')

             * Set up the days supply we are creating.
             QO = SUM(QTYS)-SUM(OLD.QTYS)
             IF QO >= 0 THEN
                BEGIN CASE
                CASE PIL+(QO) <= 0
                   DSUP = 0
                CASE DEMAND # 0
                   DSUP = (PIL+QO)/DEMAND
                CASE OTHERWISE
                   DSUP = 999999
                END CASE

                * If the days they are ordering is greater than the
                * control file warn them
                IF DSUP > MDAYS THEN
                   PRMPT = ''
                   IF PIL.OVRD THEN
                      ACTION.OK = ''
                      PRMPT := '  You Are About To Affect Inventory Levels  '
                      PRMPT := AM:'  With Greater Than  ':MDAYS:' Days Supply.'
                      PRMPT := AM:'            Continue? (Y/N) : '
IN$$8:                INP.PROMPT ACTION.OK,PRMPT,'YN',1
                   END ELSE
                      PRMPT = 'Not Allowed to Affect Inventory Levels With Greater than  ':MDAYS:' Days Supply'
                      A = ''
                      ACTION.OK = NO
IN$$9:                INP.PROMPT A,PRMPT,,0
                   END

                   * If they don't give authorization for this don't
                   * do it.
                   IF NOT(ACTION.OK) THEN
                      PIL.OK = NO
                   END
                END
             END
          END

          RETURN
*-------------------------------------------------------------------------*
SUBS:     ON OPTION GOTO INS.LINE,DEL.LINE,FLDGR,HLDGR,REOPN,IVINQ,VTAG,VLOG,CVIEW,MOVE1,SER.DET,LOT.DET,LOC.MAINT
*-------------------------------------------------------------------------*
INS.LINE: *** insert one location line

          IF VIEW.ONLY THEN RETURN
          LOCAS     = INSERT(LOCAS,1,LINE;'')
          QTYS      = INSERT(QTYS,1,LINE;'')
          LSTATS    = INSERT(LSTATS,1,LINE;'')
          LMINS     = INSERT(LMINS,1,LINE;'')
          LMAXS     = INSERT(LMAXS,1,LINE;'')
          LUOMS     = INSERT(LUOMS,1,LINE;'')
          LCNTS     = INSERT(LCNTS,1,LINE;'')
          LSBYS     = INSERT(LSBYS,1,LINE;'')
          SNUMS     = INSERT(SNUMS,1,LINE;'')
          SQTYS     = INSERT(SQTYS,1,LINE;'')
          LPSTS     = INSERT(LPSTS,1,LINE;'')
          LPLCS     = INSERT(LPLCS,1,LINE;'')
          PPQTYS    = INSERT(PPQTYS,1,LINE;'')
          LEXPDTS   = INSERT(LEXPDTS,1,LINE;'')
          LRCVDTS   = INSERT(LRCVDTS,1,LINE;'')
          LPUTDTS   = INSERT(LPUTDTS,1,LINE;'')
          LREV.TYPS = INSERT(LREV.TYPS,1,LINE;'')
          LTYPE   = ''
          LOC.ID  = ''
          VINS LINE
          LN.CT += 1
          DSP.LINES = LN.CT
          GOSUB GET.LINE

          RETURN
*-------------------------------------------------------------------------*
DEL.LINE: *** Delete one location line

          IF VIEW.ONLY THEN RETURN

          IF LEN(LTYPE)>1 AND INDEX('CS',LTYPE[1,1],1) AND NOT(FROM.MOVE) THEN
             MSG  = 'Cannot delete qty on consignment location. Change '
             MSG := 'thru an order or po.'
             ERR.MESS 3,3,BELL:MSG,YES
             RETURN
          END
          IF FIELD(LOCAS<1,LINE>,'~',4) THEN PRINT BELL:; RETURN

          CHK.TYP    = FIELD(LOCAS<1,LINE>,'~',1)
          IF LEN(CHK.TYP)>1 AND INDEX('CS',LTYPE[1,1],1) AND FROM.MOVE THEN
             CHK.TYP = CHK.TYP[1,1]
          END
          V.CHK.TYPS = 'S':VM:'F':VM:'O':VM:'R':VM:'L':VM:'T':VM:'C'
          LOCATE CHK.TYP IN V.CHK.TYPS<1> SETTING FOUND.TYPE ELSE
             MESS    = 'Invalid location type.  Enter a valid location '
             MESS   := 'type before deleting location'
             MESS<2> = 'Press <ENTER>'
             ERR.MESS 3,3,BELL:MESS
IN$$12:      INP A,,,1
             RETURN
          END

          * Warn user if they are not authorized or if they are about to
          * break a tag
          IF CHK.TYP = 'T' AND NOT(FROM.MOVE) THEN
             OID   = FIELD(TAG.ID,'.',1)
             PRMPT = 'Change a tagged qty'
             OE.GET.AUTH OID,PRMPT,'OE.TAGGED.QTY.EDIT',ACTION.OK
             IF ACTION.OK THEN BREAK.TAG = YES ELSE RETURN
          END

          * If auth level 2 and move qtys control is yes then total
          * on hand needs to stay the same. So save deleted info
          * in case user backs out of adjust line.
          IF PLQM AND LEVEL = 2 THEN
             IF QTYS<1,LINE>+0 # 0 AND LN.CT = 1 THEN PRINT BELL:; RETURN
             SV.LINE     = LINE
             SV.LOCA     = LOCAS<1,LINE>
             SV.LSTAT    = LSTATS<1,LINE>
             SV.LMIN     = LMINS<1,LINE>
             SV.LMAX     = LMAXS<1,LINE>
             SV.LUOM     = LUOMS<1,LINE>
             SV.LCNT     = LCNTS<1,LINE>
             SV.LSBY     = LSBYS<1,LINE>
             SV.SNUM     = SNUMS<1,LINE>
             SV.SQTY     = SQTYS<1,LINE>
             SV.LPST     = LPSTS<1,LINE>
             SV.LPLC     = LPLCS<1,LINE>
             SV.PPQTY    = PPQTYS<1,LINE>
             SV.LEXPDT   = LEXPDTS<1,LINE>
             SV.LRCVDT   = LRCVDTS<1,LINE>
             SV.LPUTDT   = LPUTDTS<1,LINE>
             SV.LREV.TYP = LREV.TYPS<1,LINE>
          END

          DIFF.QTY = -QTYS<1,LINE>

          IF PLQM AND LEVEL = 2 AND DIFF.QTY AND NOT(FROM.MOVE) THEN
             LTYPE       = FIELD(LOCAS<1,LINE>,'~',1)
             DIFF.LTYPE  = LTYPE
          END

          LOCAS     = DELETE(LOCAS,1,LINE)
          QTYS      = DELETE(QTYS,1,LINE)
          LSTATS    = DELETE(LSTATS,1,LINE)
          LMINS     = DELETE(LMINS,1,LINE)
          LMAXS     = DELETE(LMAXS,1,LINE)
          LUOMS     = DELETE(LUOMS,1,LINE)
          LCNTS     = DELETE(LCNTS,1,LINE)
          SNUMS     = DELETE(SNUMS,1,LINE)
          SQTYS     = DELETE(SQTYS,1,LINE)
          LSBYS     = DELETE(LSBYS,1,LINE)
          LPSTS     = DELETE(LPSTS,1,LINE)
          LPLCS     = DELETE(LPLCS,1,LINE)
          PPQTYS    = DELETE(PPQTYS,1,LINE)
          LEXPDTS   = DELETE(LEXPDTS,1,LINE)
          LRCVDTS   = DELETE(LRCVDTS,1,LINE)
          LPUTDTS   = DELETE(LPUTDTS,1,LINE)
          LREV.TYPS = DELETE(LREV.TYPS,1,LINE)
          VDEL LINE
          IF LN.CT > 1 THEN LN.CT += -1
          IF LINE > LN.CT THEN LINE = LN.CT
          DSP.LINES = LN.CT

          * If auth level 2 and move qtys control is yes then
          * total on hand needs to stay the same.
          IF PLQM AND LEVEL = 2 AND DIFF.QTY AND NOT(FROM.MOVE) THEN
             VEN.CONS.MV = NO
             FROM.DEL    = YES
             GOSUB GET.ADJ.LN
             FROM.DEL    = NO
          END

          RETURN
*-------------------------------------------------------------------------*
FLDGR:    *** future ledger

          PRODUCT.LEDGER.EXEC BR,PN

          RETURN
*-------------------------------------------------------------------------*
HLDGR:    *** history ledger

          INV.HISTORY.LEDGER PN,,BR

          RETURN
*-------------------------------------------------------------------------*
IVINQ:    *** inventory inquiry

          INV.INQ PN,BR

          RETURN
*-------------------------------------------------------------------------*
VTAG:     *** view the tag - view only.

          LOCA = LOCAS<1,LINE>
          IF LOCA[1,1] = 'C' THEN
             LOCA = FIELD(LOCA,'~',1)
             CUS.CN = LOCA[2,99]
             IF CUS.CN THEN
                CUSTOMER.MAINT CUS.CN:AM:YES
             END
          END ELSE
             PRD.LOC.MAINT.VIEW.TAG PN,LOCA
          END

          RETURN
*-------------------------------------------------------------------------*
VLOG:     *** view the product location activity log

          PRD.LOG.VIEW BR,PN

          RETURN
*-------------------------------------------------------------------------*
CVIEW:    *** change view

          PREV.VIEW = VIEW
          SV.LINE   = LINE
          MENU.TABLE OPT,,,1,7,35,,,VIEW.OPTS,'Views',VIEW
          IF OPT='' THEN RETURN
          LOCATE OPT IN VIEW.OPTS<1> SETTING VIEW ELSE VIEW = 1
          IF PREV.VIEW > 2 THEN
             WINDOW.CHILD.CLOSE
          END
          GOSUB LOAD.VIEW

          VCT = DCOUNT(LOCAS<1>,VM)
          FOR LINE = 1 TO VCT
             GOSUB GET.LINE
             GOSUB DISP.VIEW
          NEXT LINE
          LINE = SV.LINE

          RETURN TO IN.TABLE
*-------------------------------------------------------------------------*
GET.COLS: *** This returns the COLS variable that holds the number of
          *** columns for the current view.

          IF RF.LOC.BY.UOM THEN
             COLS = 8
          END ELSE
             COLS = 7
          END

          BEGIN CASE
          CASE VIEW = 3; COLS -= 2
          CASE VIEW = 4 OR VIEW = 9; COLS -= 1
          CASE VIEW = 5; COLS -= 2
          END CASE

          RETURN
*-------------------------------------------------------------------------*
LOAD.VIEW: *** This displays the lines and column heading for the
          *** current view.  Also, this returns COLS.

          GOSUB GET.COLS

          BEGIN CASE
          CASE VIEW = 1
             PRINT @(62,5):'Last CntPickStat'
          CASE VIEW = 2
             PRINT @(62,5):'MinQtyMaxQty'
          CASE VIEW = 3
             WINDOW.CHILD 62,5,17,10,9
             PRINT @(62,5):'HomeLocation'
             FOR J=6 TO 15
                PRINT @(62,J): '                '
             NEXT J
          CASE VIEW = 4
             WINDOW.CHILD 62,5,17,10,9
             PRINT @(62,5):'Pre-Pack Qty'
             FOR J=6 TO 15
                PRINT @(62,J): '                '
             NEXT J
          CASE VIEW = 5
             WINDOW.CHILD 62,5,17,10,9
             PRINT @(62,5):'Tote'
             FOR J=6 TO 15
                PRINT @(62,J): '                 '
             NEXT J
          CASE VIEW = 6
             WINDOW.CHILD 62,5,17,10,9
             PRINT @(62,5):'Last CntExp Date'
             FOR J=6 TO 15
                PRINT @(62,J):'                '
             NEXT J
          CASE VIEW = 7
             WINDOW.CHILD 62,5,17,10,9
             PRINT @(62,5):'Last CntRcvd Dt '
             FOR J = 6 TO 15
                PRINT @(62,J):'                '
             NEXT J
          CASE VIEW = 8
             WINDOW.CHILD 62,5,17,10,9
             PRINT @(62,5):'RF Put Away Dt/Tm'
             FOR J = 6 TO 15
                PRINT @(62,J):'                 '
             NEXT J
          CASE VIEW = 9
             WINDOW.CHILD 62,5,17,10,9
             PRINT @(62,5):'Last CntTypeOld'
             FOR J = 6 TO 15
                PRINT @(62,J):'               '
             NEXT J
          END CASE

          RETURN
*-------------------------------------------------------------------------*
MOVE1:    *** Move line from one place on the screen to another.

          IF NEW.LN THEN PRINT BELL:; RETURN
          IF FIELD(LOCAS<1,LINE>,'~',4) # '' THEN
             MSG = 'You cannot move an inprocess line. Press <Enter>'
             MESS 10,5,BELL:MSG
IN$$7:       INP A,,,0
             RETURN
          END

          WINDOW.CHILD 14,3,51,1,3
          MSG = 'Position Cursor to new position, <Enter> to move...'
          PRINT @(14,3):BLINK$:MSG:NORM$:

          SV.LINE = LINE
          NEW.LN  = LINE
          LOOP
IN$$6:       INPV A,1,NEW.LN,0
             BEGIN CASE
             CASE MOVE = 5 OR QUIT;                 EXIT
             CASE MOVE = 2 AND NEW.LN > 1;          NEW.LN -= 1
             CASE MOVE = 4 AND NEW.LN =< LN.CT;     NEW.LN += 1
             CASE OTHERWISE;                        PRINT BELL:
             END CASE
          REPEAT

          IF QUIT OR NEW.LN=SV.LINE OR NEW.LN=SV.LINE+1 THEN GOTO EXIT.MV

          LINE = NEW.LN
          GOSUB INS.LINE

          IF LINE < SV.LINE THEN SV.LINE += 1
          LOCAS<1,LINE>     = LOCAS<1,SV.LINE>
          QTYS<1,LINE>      = QTYS<1,SV.LINE>
          LSTATS<1,LINE>    = LSTATS<1,SV.LINE>
          LMINS<1,LINE>     = LMINS<1,SV.LINE>
          LMAXS<1,LINE>     = LMAXS<1,SV.LINE>
          LUOMS<1,LINE>     = LUOMS<1,SV.LINE>
          LCNTS<1,LINE>     = LCNTS<1,SV.LINE>
          LSBYS<1,LINE>     = LSBYS<1,SV.LINE>
          LPSTS<1,LINE>     = LPSTS<1,SV.LINE>
          LPLCS<1,LINE>     = LPLCS<1,SV.LINE>
          LEXPDTS<1,LINE>   = LEXPDTS<1,SV.LINE>
          LRCVDTS<1,LINE>   = LRCVDTS<1,SV.LINE>
          LPUTDTS<1,LINE>   = LPUTDTS<1,SV.LINE>
          LREV.TYPS<1,LINE> = LREV.TYPS<1,SV.LINE>
          GOSUB DISP.LN

          FROM.MOVE = YES
          DIFF.QTY  = 0
          LINE      = SV.LINE
          GOSUB DEL.LINE

          FROM.MOVE = NO
          LINE      = NEW.LN

EXIT.MV:  WINDOW.CHILD.CLOSE
          NEW.LN = 0

          RETURN
*-------------------------------------------------------------------------*
REOPN:    *** reopen in edit mode

          IF NOT(VIEW.ONLY) THEN RETURN
          VIEW.ONLY = NO

          RETURN TO GET.PN
*-------------------------------------------------------------------------*
SER.DET:  *** Serial# Detail Queue

          IF FIELD(LOCAS<1,LINE>,'~',4) AND SLC.FLAG THEN RETURN

          GOSUB UPD.DATA
          LOCAS = NEW.PRDD.BR<8>

          BEGIN CASE
          CASE ERR.TO = 'LOT';    RETURN TO IN.LOT
          CASE ERR.TO = 'EDIT';   RETURN TO EDIT
          END CASE

          PROD.SERIAL.QUEUE.DETAIL PN:VM:BR:VM:VIEW.ONLY:VM:LOCAS<1,LINE>

          GOSUB LOAD.DATA
          GOSUB DISP.LINES

          * Redisplay the serial number balance
          IF PRD.BR(25)='I' OR PRD.BR(25)='A' OR PRD.BR(25)='D' THEN
             TMP.SQTYS = PRDD.BR(21)
             IF SLC.FLAG THEN CONVERT SVM TO VM IN TMP.SQTYS
             SER.BAL = SUMMATION(TMP.SQTYS)/PER
             PRINT @(49,3):'Ser# Balance  : ':SER.BAL OH.FMT:PER.UM "L#2"
          END

          RETURN
*-------------------------------------------------------------------------*
LOT.DET:  *** view detail lot info

          SV.LOT = LOT
          LOT = FIELD(LOT.ID,'-',1)
          IF LOT#'' THEN LOT = '*':LOT

          GOSUB CALL.LOT

          LOT = SV.LOT
          LASTKEY = 0; MOVE = 0; LINE = CURR.LINE; COL = 1

          RETURN
*-------------------------------------------------------------------------*
CALL.LOT: *** call detail lot info screen

          MERGE.OK = YES
          IF NOT(VIEW.ONLY) THEN
             GOSUB UPD.DATA
             IF ERR.TO THEN MERGE.OK = NO
          END

          LOT.MAINT BR,PN,LOT,CHNG,VIEW.ONLY,MERGE.OK

          IF CHNG THEN
             MERGED    = YES
             GOSUB LOAD.DATA
             GOSUB DISP.LINES
          END

          RETURN
*-------------------------------------------------------------------------*
LOC.MAINT: *** Call Location Detail Maintenance for this location

          * If the user doesn't have the ability to change overall qty,
          * don't allow them to change detailed info in location maint.
          LDATA = ''
          CURR.LOC = FIELD(FIELD(LOCAS<1,LINE>,'~',2),'|',1)
          IF LEVEL < 3 THEN
             LOC.DB.MAINT.GET BR,CURR.LOC,CURR.LOC,'',LDATA,'','',''
             LDATA = RAISE(LDATA<1>)
             LOC.DB.SEARCH.DET BR,'',1,CURR.LOC,LDATA,'',YES
          END ELSE
             PASSER = VIEW.ONLY:AM:BR:AM:CURR.LOC
             LOC.DB.MAINT PASSER
          END

          RETURN
*-------------------------------------------------------------------------*
LOAD.DATA: *** Load location data into user friendly variables.

          QTYS      = PRDD.BR(1)
          LOCAS     = PRDD.BR(8)
          CTYP      = PRD.BR(11)
          LSTATS    = PRDD.BR(9)
          LMINS     = PRDD.BR(10)
          LMAXS     = PRDD.BR(11)
          LCNTS     = PRDD.BR(12)
          LSBYS     = PRDD.BR(13)
          SNUMS     = PRDD.BR(20)
          SQTYS     = PRDD.BR(21)
          LPSTS     = PRDD.BR(14)
          LPLCS     = PRDD.BR(15)
          PPQTYS    = PRDD.BR(16)
          LUOMS     = PRDD.BR(17)
          LEXPDTS   = PRDD.BR(18)
          LRCVDTS   = PRDD.BR(19)
          LPUTDTS   = PRDD.BR(30)
          LREV.TYPS = PRDD.BR(31)

          * Save all the original data so that when they answer 'N'
          * to the 'Change Onhand by XX?' prompt, we can restore
          * the values.
          OLD.QTYS      = QTYS
          OLD.LOCAS     = LOCAS
          OLD.LSTATS    = LSTATS
          OLD.LMINS     = LMINS
          OLD.LMAXS     = LMAXS
          OLD.LUOMS     = LUOMS
          OLD.LCNTS     = LCNTS
          OLD.LSBYS     = LSBYS
          OLD.SNUMS     = SNUMS
          OLD.SQTYS     = SQTYS
          OLD.LPSTS     = LPSTS
          OLD.LPLCS     = LPLCS
          OLD.PPQTYS    = PPQTYS
          OLD.LEXPDTS   = LEXPDTS
          OLD.LRCVDTS   = LRCVDTS
          OLD.LPUTDTS   = LPUTDTS
          OLD.LREV.TYPS = LREV.TYPS

          LN.CT = DCOUNT(LOCAS<1>,VM)
          IF DCOUNT(QTYS<1>,VM) > LN.CT THEN LN.CT = DCOUNT(QTYS<1>,VM)
          IF LN.CT < 1 THEN LN.CT = 1
          IF DSP.LINES > LN.CT THEN
             FOR X = LN.CT+1 TO DSP.LINES
                VDEL X
             NEXT X
          END
          DSP.LINES = LN.CT

          RETURN
*-------------------------------------------------------------------------*
CALC.ONHAND: *** calc onhand

          GET.ONHAND PRDD.BR(1),PRDD.BR(8),CURR.ONHAND
          CURR.ONHAND = CURR.ONHAND / PER

          RETURN
*-------------------------------------------------------------------------*
SET.MENUS: *** Set Menus

          MENU.CLEAR
          MENU.LOAD ,,,,INSERT.KEY
          MENU.LOAD ,,,,DELETE.KEY
          IF BR.AUTH THEN
             MENU.LOAD  1,17,8,1,'F'
             MENU.LOAD 10,17,9,1,'H'
             MENU.LOAD ,,,,'1'
          END ELSE
             MENU.LOAD ,,,,
             MENU.LOAD ,,,,
             MENU.LOAD ,,,,
          END
          MENU.LOAD 20,17,7,1,'I'
          MENU.LOAD 28,17,8,6,'T'
          MENU.LOAD 37,17,8,6,'L'
          MENU.LOAD 46,17,4,1,'V'
          MENU.LOAD 51,17,7,1,'M'
          MENU.LOAD 59,17,7,1,'S'

          BEGIN CASE
          CASE CTYP[1,1] = 'D'
             MENU.LOAD 67,17,7,1,'D'
          CASE OTHERWISE
             MENU.LOAD
          END CASE
          MENU.LOAD 75,17,4,3,'C'

          RETURN
*-------------------------------------------------------------------------*
RESTORE.VALS: *** restore the original values, adding back the original
          *** locations if necessary

          OCT = DCOUNT(OLD.LOCAS<1>,VM)
          FOR J = 1 TO OCT
             OLD.LOC = OLD.LOCAS<1,J>
             OLD.QTY = OLD.QTYS<1,J>
             LOCATE OLD.LOC IN LOCAS<1> SETTING LPOS THEN
                QTYS<1,LPOS> = OLD.QTY
             END ELSE
                * put the old location back in
                IF OLD.QTYS<1,J>+0 # '0' THEN
                   LOCAS<1>     = INSERT(LOCAS<1>  ,1,J;OLD.LOC)
                   QTYS<1>      = INSERT(QTYS<1>   ,1,J;OLD.QTY)
                   LSTATS<1>    = INSERT(LSTATS<1> ,1,J;OLD.LSTATS<1,J>)
                   LMINS<1>     = INSERT(LMINS<1>  ,1,J;OLD.LMINS<1,J>)
                   LMAXS<1>     = INSERT(LMAXS<1>  ,1,J;OLD.LMAXS<1,J>)
                   LUOMS<1>     = INSERT(LUOMS<1>  ,1,J;OLD.LUOMS<1,J>)
                   LCNTS<1>     = INSERT(LCNTS<1>  ,1,J;OLD.LCNTS<1,J>)
                   LSBYS<1>     = INSERT(LSBYS<1>  ,1,J;OLD.LSBYS<1,J>)
                   SNUMS<1>     = INSERT(SNUMS<1>  ,1,J;OLD.SNUMS<1,J>)
                   SQTYS<1>     = INSERT(SQTYS<1>  ,1,J;OLD.SQTYS<1,J>)
                   LPSTS<1>     = INSERT(LPSTS<1>  ,1,J;OLD.LPSTS<1,J>)
                   LPLCS<1>     = INSERT(LPLCS<1>  ,1,J;OLD.LPLCS<1,J>)
                   PPQTYS<1>    = INSERT(PPQTYS<1> ,1,J;OLD.PPQTYS<1,J>)
                   LEXPDTS<1>   = INSERT(LEXPDTS<1>,1,J;OLD.LEXPDTS<1,J>)
                   LRCVDTS<1>   = INSERT(LRCVDTS<1>,1,J;OLD.LRCVDTS<1,J>)
                   LPUTDTS<1>   = INSERT(LPUTDTS<1>,1,J;OLD.LPUTDTS<1,J>)
                   LREV.TYPS<1> = INSERT(LREV.TYPS<1>,1,J;OLD.LREV.TYPS<1,J>)
                END
             END
          NEXT J

          RETURN
*-------------------------------------------------------------------------*
CHECK.VALID.TYPE: *** Check to see if a location has an invalid loc of 'Z'

          INVALID.TYPE = NO
          INVALID.LINE = ''
          FOR TYPE.CT = 1 TO LN.CT
             LTYPE = FIELD(LOCAS<1,TYPE.CT>,'~',1)
             IF LTYPE = 'Z' THEN
                INVALID.TYPE = YES
                INVALID.LINE = TYPE.CT
                EXIT
             END
          NEXT TYPE.CT

          RETURN
*-------------------------------------------------------------------------*
CHECK.VALID.STAT: *** Check to see if the location status is set

         INVALID.STAT = NO
         INVALID.LINE = ''
         FOR STAT.CT = 1 TO LN.CT
         STAT = LSTATS<1,LINE>
            IF STAT= '' THEN
               INVALID.STAT = YES
               INVALID.LINE = STAT.CT
               EXIT
            END
         NEXT STAT.CT

         RETURN
*-------------------------------------------------------------------------*
FINISH:   WINDOW.CLOSE
          RETURN
*-------------------------------------------------------------------------*
!SMITJR~05/09/10~15:38
